Don't leak visible_region. Use visible_region instead of region.
author2 <alexl@redhat.com>
Mon, 22 Jan 2001 14:35:49 +0000 (14:35 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Mon, 22 Jan 2001 14:35:49 +0000 (14:35 +0000)
2001-01-22    <alexl@redhat.com>

* gdk/gdkwindow.c (gdk_window_invalidate_region):
Don't leak visible_region. Use visible_region instead of region.

* gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
Don't do extra gdk_drawable_ref(). This is not X.
(gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
gdk_fb_focused_window is ref:ed.
(gdk_fb_window_send_crossing_events): Watch out for destroyed
windows.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/gdkwindow.c
gdk/linux-fb/gdkwindow-fb.c

index 7840bcb8e43c2b98ff908df711a287481f9d8178..8b6f7f4a20da135375d57da37cec8c3e27b80a72 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-01-22    <alexl@redhat.com>
+
+       * gdk/gdkwindow.c (gdk_window_invalidate_region):
+       Don't leak visible_region. Use visible_region instead of region.
+       
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+       Don't do extra gdk_drawable_ref(). This is not X.
+       (gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
+       gdk_fb_focused_window is ref:ed.
+       (gdk_fb_window_send_crossing_events): Watch out for destroyed
+       windows.
+
 2001-01-22    <alexl@redhat.com>
 
        * gtk/gtkwindow-decorate.c (gtk_decorated_window_realize):
index 7840bcb8e43c2b98ff908df711a287481f9d8178..8b6f7f4a20da135375d57da37cec8c3e27b80a72 100644 (file)
@@ -1,3 +1,15 @@
+2001-01-22    <alexl@redhat.com>
+
+       * gdk/gdkwindow.c (gdk_window_invalidate_region):
+       Don't leak visible_region. Use visible_region instead of region.
+       
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+       Don't do extra gdk_drawable_ref(). This is not X.
+       (gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
+       gdk_fb_focused_window is ref:ed.
+       (gdk_fb_window_send_crossing_events): Watch out for destroyed
+       windows.
+
 2001-01-22    <alexl@redhat.com>
 
        * gtk/gtkwindow-decorate.c (gtk_decorated_window_realize):
index 7840bcb8e43c2b98ff908df711a287481f9d8178..8b6f7f4a20da135375d57da37cec8c3e27b80a72 100644 (file)
@@ -1,3 +1,15 @@
+2001-01-22    <alexl@redhat.com>
+
+       * gdk/gdkwindow.c (gdk_window_invalidate_region):
+       Don't leak visible_region. Use visible_region instead of region.
+       
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+       Don't do extra gdk_drawable_ref(). This is not X.
+       (gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
+       gdk_fb_focused_window is ref:ed.
+       (gdk_fb_window_send_crossing_events): Watch out for destroyed
+       windows.
+
 2001-01-22    <alexl@redhat.com>
 
        * gtk/gtkwindow-decorate.c (gtk_decorated_window_realize):
index 7840bcb8e43c2b98ff908df711a287481f9d8178..8b6f7f4a20da135375d57da37cec8c3e27b80a72 100644 (file)
@@ -1,3 +1,15 @@
+2001-01-22    <alexl@redhat.com>
+
+       * gdk/gdkwindow.c (gdk_window_invalidate_region):
+       Don't leak visible_region. Use visible_region instead of region.
+       
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+       Don't do extra gdk_drawable_ref(). This is not X.
+       (gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
+       gdk_fb_focused_window is ref:ed.
+       (gdk_fb_window_send_crossing_events): Watch out for destroyed
+       windows.
+
 2001-01-22    <alexl@redhat.com>
 
        * gtk/gtkwindow-decorate.c (gtk_decorated_window_realize):
index 7840bcb8e43c2b98ff908df711a287481f9d8178..8b6f7f4a20da135375d57da37cec8c3e27b80a72 100644 (file)
@@ -1,3 +1,15 @@
+2001-01-22    <alexl@redhat.com>
+
+       * gdk/gdkwindow.c (gdk_window_invalidate_region):
+       Don't leak visible_region. Use visible_region instead of region.
+       
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+       Don't do extra gdk_drawable_ref(). This is not X.
+       (gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
+       gdk_fb_focused_window is ref:ed.
+       (gdk_fb_window_send_crossing_events): Watch out for destroyed
+       windows.
+
 2001-01-22    <alexl@redhat.com>
 
        * gtk/gtkwindow-decorate.c (gtk_decorated_window_realize):
index 7840bcb8e43c2b98ff908df711a287481f9d8178..8b6f7f4a20da135375d57da37cec8c3e27b80a72 100644 (file)
@@ -1,3 +1,15 @@
+2001-01-22    <alexl@redhat.com>
+
+       * gdk/gdkwindow.c (gdk_window_invalidate_region):
+       Don't leak visible_region. Use visible_region instead of region.
+       
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+       Don't do extra gdk_drawable_ref(). This is not X.
+       (gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
+       gdk_fb_focused_window is ref:ed.
+       (gdk_fb_window_send_crossing_events): Watch out for destroyed
+       windows.
+
 2001-01-22    <alexl@redhat.com>
 
        * gtk/gtkwindow-decorate.c (gtk_decorated_window_realize):
index 7840bcb8e43c2b98ff908df711a287481f9d8178..8b6f7f4a20da135375d57da37cec8c3e27b80a72 100644 (file)
@@ -1,3 +1,15 @@
+2001-01-22    <alexl@redhat.com>
+
+       * gdk/gdkwindow.c (gdk_window_invalidate_region):
+       Don't leak visible_region. Use visible_region instead of region.
+       
+       * gdk/linux-fb/gdkwindow-fb.c (gdk_window_new):
+       Don't do extra gdk_drawable_ref(). This is not X.
+       (gdk_fb_window_find_focus, gdk_fb_change_focus): make sure
+       gdk_fb_focused_window is ref:ed.
+       (gdk_fb_window_send_crossing_events): Watch out for destroyed
+       windows.
+
 2001-01-22    <alexl@redhat.com>
 
        * gtk/gtkwindow-decorate.c (gtk_decorated_window_realize):
index 42ded204beda1f616deb7f5754307181cc3fe2fc..0a703045fd08b4bd5d861d42eb59fec547a385ad 100644 (file)
@@ -1796,16 +1796,16 @@ gdk_window_invalidate_region (GdkWindow *window,
   visible_region = gdk_drawable_get_visible_region (window);
   gdk_region_intersect (visible_region, region);
 
-  if (!gdk_region_empty (region))
+  if (!gdk_region_empty (visible_region))
     {
       if (private->update_area)
        {
-         gdk_region_union (private->update_area, region);
+         gdk_region_union (private->update_area, visible_region);
        }
       else
        {
          update_windows = g_slist_prepend (update_windows, window);
-         private->update_area = gdk_region_copy (region);
+         private->update_area = gdk_region_copy (visible_region);
          
          if (!private->update_freeze_count && !update_idle)
            update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
@@ -1830,7 +1830,7 @@ gdk_window_invalidate_region (GdkWindow *window,
                  gdk_window_get_position ((GdkWindow *)child, &x, &y);
 
                  /* This copy could be saved with a little more complexity */
-                 child_region = gdk_region_copy (region);
+                 child_region = gdk_region_copy (visible_region);
                  gdk_region_offset (child_region, -x, -y);
                  
                  gdk_window_invalidate_region ((GdkWindow *)child, child_region, TRUE);
@@ -1840,6 +1840,8 @@ gdk_window_invalidate_region (GdkWindow *window,
            }
        }
     }
+  
+  gdk_region_destroy (visible_region);
 }
 
 GdkRegion *
index d649328301c4fd4e571a390abab69900514c011d..a9df73e8ce08831e9a6227a3455845837dcb7e89 100644 (file)
@@ -254,8 +254,6 @@ gdk_window_new (GdkWindow     *parent,
       impl->drawable_data.colormap = NULL;
     }
 
-  gdk_drawable_ref (window);
-  
   if (impl->drawable_data.colormap)
     gdk_colormap_ref (impl->drawable_data.colormap);
   
@@ -488,7 +486,7 @@ gdk_fb_window_find_focus (void)
     return _gdk_fb_keyboard_grab_window;
   
   if (!gdk_fb_focused_window)
-    gdk_fb_focused_window = gdk_parent_root;
+    gdk_fb_focused_window = gdk_window_ref (gdk_parent_root);
   
   return gdk_fb_focused_window;
 }
@@ -525,8 +523,11 @@ gdk_fb_change_focus (GdkWindow *new_focus_window)
          event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE);
          event->in = TRUE;
        }
+      
+      if (gdk_fb_focused_window)
+       gdk_window_unref (gdk_fb_focused_window);
+      gdk_fb_focused_window = gdk_window_ref (new_win);
     }
-  gdk_fb_focused_window = new_win;
 }
 
 static GdkWindow *
@@ -597,6 +598,13 @@ gdk_fb_window_send_crossing_events (GdkWindow *src,
   if (a==b)
     return;
 
+  /* gdk_fb_window_containing_pointer might have been destroyed.
+   * The refcount we hold on it should keep it, but it's parents
+   * might have died.
+   */
+  if (GDK_WINDOW_DESTROYED (a))
+    a = gdk_parent_root;
+  
   gdk_fb_mouse_get_info (&x, &y, &my_mask);
 
   c = gdk_fb_find_common_ancestor (a, b);